import pdfplumber
import json

path = r'10.MyBatis查询数据库.pdf'

'''字典组成的列表，按照某一个属性归类，也就是返回一个二维数组'''


def groupByKey(arr, key='y0', yBalance=3.19):
    tempValue = arr[0][key]
    tempIndex = 0
    results = []
    while (True):
        tempArr = []
        flag = False
        for i, j in enumerate(arr[tempIndex:]):
            # 注意char的y0属性表示每一个字符距离页面底部的距离，同一行文本可能有一个偏移值，所以需要加上这个范围
            # 否则同一行文本会被割裂成多行
            if float(j[key]) >= float(tempValue) - yBalance and float(j[key]) <= float(tempValue) + yBalance:
                tempArr.append(j)
            else:
                tempValue = j[key]
                tempIndex += i
                flag = True
                break
        results.append(tempArr)
        if not flag:
            break
    return results


'''通过检测字符的字体来判断是否是代码文本，也就是pdf中那个蓝色的斜体字体'''


def checkIsCode(arr):
    for i in arr:
        # 要注意空格的字体和文本的字体还不一样
        if i['fontname'] == 'JJDCVA+Times-BoldItalic' or i['fontname'] == 'DCQJKI+Times-BoldItalic':
            return True
    return False


'''处理单页pdf'''


def handleSinglePage(page, index):
    chars = page.chars
    # 通过char对象的y0属性转为二维数组
    results = groupByKey(chars, 'y0')
    resultList = []
    for j in results:
        textTemp = ''
        for k in j:
            textTemp += k['text']
        # 去掉这个特殊字符，转为普通空格
        textTemp = textTemp.replace('\xa0', ' ')
        resultList.append({'text': textTemp, 'isCode': checkIsCode(j)})
    # 写入json文件
    json.dump(resultList, open('./jsonFiles/' + str(index) + '.json', 'w', encoding='utf-8'), ensure_ascii=False,
              indent=4)


with pdfplumber.open(path) as pdf:
    # 获取所有page对象
    pages = pdf.pages
    for i, page in enumerate(pages[18:]):
        handleSinglePage(page, i + 18)
        print('page ' + str(i + 18) + ' completed!')
